#pragma once

// 普通类
#define xname(...)                          name__(__VA_ARGS__)

// 模板类
#define xtmpl(...)                          tmpl__(__VA_ARGS__)

// 特化模板类
#define xspec(...)                          spec__(__VA_ARGS__)

// 公有的基类 (public base)
#define xpubb(...)                          pubb__(__VA_ARGS__)

// 受保护的基类 (protected base)
#define xprob(...)                          prob__(__VA_ARGS__)

// 私有基类 (private base)
#define xprib(...)                          prib__(__VA_ARGS__)

// 公有字段 (public field)
#define xpubf(...)                          pubf__(__VA_ARGS__)

// 受保护的字段 (protected field)
#define xprof(...)                          prof__(__VA_ARGS__)

// 私有的字段 (private field)
#define xprif(...)                          prif__(__VA_ARGS__)

// 公有字段 无 mutable 标记 (public field)
#define xpubf_no_mut(...)                   pubf_no_mut__(__VA_ARGS__)

// 受保护的字段 无 mutable 标记 (protected field)
#define xprof_no_mut(...)                   prof_no_mut__(__VA_ARGS__)

// 私有的字段 无 mutable 标记 (private field)
#define xprif_no_mut(...)                   prif_no_mut__(__VA_ARGS__)

// 公有压缩字段 (public compressed field)
#define xpubc(...)                          pubc__(__VA_ARGS__)

// 受保护的压缩字段 (protected compressed field)
#define xproc(...)                          proc__(__VA_ARGS__)

// 私有的压缩字段 (private compressed field)
#define xpric(...)                          pric__(__VA_ARGS__)

// 与该结构关联的类型 (association)
// 如果该结构体使用字节数组代替某个对象，在使用时又需要以该对象类型使用，需要使用此宏标记对象类型
// 在一些类似 nullable 的结构体中，如果获取到对象，那么内部字节数组当作对象使用，否则则无动作
// 这种模糊的类型 GC 无法直接识别，需要手动标记当前结构关联了那些类型，同时还需要对 GC 提供访问该对象的方法
// 如果对象为 "null" 这个状态，那么在提供 GC 访问函数中直接返回即可，否则需要进一步遍历这个对象的成员，这里先标记有这么一回事
#define xasso(...)                          asso__(__VA_ARGS__)

// 函数签名列表
#define xfunc(...)                          func__(__VA_ARGS__)

// 返回值
#define xret(...)                           ret__(__VA_ARGS__)

// 参数
#define xarg(...)                           arg__(__VA_ARGS__)

// operator
#define xoper(...)                          oper__(__VA_ARGS__)

// 同类模板结构体标志
#define xwhos(...)                          whos__(__VA_ARGS__)

#define xattr(...)                          attr__(__VA_ARGS__)

// 支持对齐
// 和 macro/xalign.hpp 冲突，复用
// #define xalign(...)                         align__(__VA_ARGS__)
